home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / whisper / source / cdplay.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-19  |  5.0 KB  |  255 lines

  1. #include    <stdio.h>
  2. #include    <stdlib.h>
  3. #include    <cdr.h>
  4. #include    <snd.h>
  5. #include    "graphic.h"
  6. #include    "event.h"
  7. #include    "coldef.h"
  8.  
  9. #define TRUE    1
  10. #define FALSE   0
  11. #define ERR     (-1)
  12.  
  13. #define    DSP_X1    200
  14. #define    DSP_Y1    250
  15. #define    DSP_X2    (DSP_X1+DSP_SIZ*7+2)
  16. #define    DSP_Y2    (DSP_Y1+15)
  17. #define    DSP_SIZ    (4*8+6)
  18. #define    DSP_COL    COL_JACK
  19.  
  20. typedef struct {
  21.     char    min;
  22.     char    sec;
  23.     char    frame;
  24. } CDTIME;
  25.  
  26. static int    cd_event=ERR;
  27. static int    type=0,strt=0,endt=0;
  28. static int    vol=0,sts=0,no=0,acv=0,mos=ERR;
  29. static CDTIME    st,ed;
  30. static CDTIME    *track=NULL;
  31.  
  32. static int     CD_open(void)
  33. {
  34.     int     i;
  35.     CDTIME  disc;
  36.  
  37.     if ( track != NULL && acv != 0 )
  38.         return FALSE;
  39.  
  40.     if ( track == NULL && 
  41.         (track = (CDTIME *)malloc(sizeof(CDTIME)*99)) == NULL )
  42.         return ERR;
  43.  
  44.     do {
  45.         i = cdr_cdinfo(0,&type,&strt,&endt,(char *)track,(char *)&disc);
  46.     } while ( i == CDERR7 );
  47.  
  48.     if ( disc.frame-- <= 0 ) {
  49.     disc.frame = 74;
  50.     if ( disc.sec-- <= 0 ) {
  51.         disc.sec = 59;
  52.         if ( disc.min-- <= 0 )
  53.         return ERR;
  54.     }
  55.     }
  56.  
  57.     track[endt].min = disc.min;
  58.     track[endt].sec = disc.sec;
  59.     track[endt].frame = disc.frame;
  60.  
  61.     if ( i == FALSE )
  62.     acv = TRUE;
  63.  
  64.     return i;
  65. }
  66. void    CD_play(void)
  67. {
  68.     int     i;
  69.  
  70.     if ( cdr_mphase(0,&sts,&no,(char *)&st,(char *)&ed) != 0 )
  71.         return;
  72.  
  73.     if ( sts != 0 )
  74.         cdr_pause(0);
  75.  
  76.     DSP_mos(2);
  77.     if ( CD_open() )
  78.     return;
  79.  
  80.     if ( endt > 0 ) {
  81.         for ( i=0 ; i < endt && (track[i].min & 0x80) != 0 ; i++ );
  82.         no = cdr_mtplay(0,(char *)&(track[i]),(char *)&(track[endt]));
  83.     }
  84.     DSP_mos(0);
  85. }
  86. void    CD_play_no(int cdn)
  87. {
  88.     int     i;
  89.  
  90.     if ( cdr_mphase(0,&sts,&no,(char *)&st,(char *)&ed) != 0 )
  91.         return;
  92.  
  93.     if ( sts != 0 )
  94.         cdr_pause(0);
  95.  
  96.     DSP_mos(2);
  97.     if ( CD_open() )
  98.     return;
  99.  
  100.     if ( endt > 0 ) {
  101.         if ( (no = cdn - 1) < 0 ) no = 0;
  102.         if ( no >= endt ) no = 0;
  103.         for ( i=no ; i < endt && (track[i].min & 0x80) != 0 ; i++ );
  104.         cdr_mtplay(0,(char *)&(track[i]),(char *)&(track[endt]));
  105.     }
  106.     DSP_mos(0);
  107. }
  108. void    CD_next(void)
  109. {
  110.     int     i;
  111.  
  112.     if ( cdr_mphase(0,&sts,&no,(char *)&st,(char *)&ed) != 0 )
  113.         return;
  114.  
  115.     if ( sts != 0 )
  116.         cdr_pause(0);
  117.     else
  118.         no = 0;
  119.  
  120.     DSP_mos(2);
  121.     if ( CD_open() )
  122.     return;
  123.  
  124.     if ( endt > 0 ) {
  125.         if ( no >= endt ) no = 0;
  126.         for ( i=no ; i < endt && (track[i].min & 0x80) != 0 ; i++ );
  127.         cdr_mtplay(0,(char *)&(track[i]),(char *)&(track[endt]));
  128.     }
  129.     DSP_mos(0);
  130. }
  131. void    CD_back(void)
  132. {
  133.     int     i;
  134.  
  135.     if ( cdr_mphase(0,&sts,&no,(char *)&st,(char *)&ed) != 0 )
  136.         return;
  137.  
  138.     if ( sts != 0 )
  139.         cdr_pause(0);
  140.     else
  141.         no = 0;
  142.  
  143.     DSP_mos(2);
  144.     if ( CD_open() )
  145.     return;
  146.  
  147.     if ( endt > 0 ) {
  148.         if ( --no <= 0 ) no = endt;
  149.         for ( i=no-1 ; i < endt && (track[i].min & 0x80) != 0 ; i++ );
  150.         cdr_mtplay(0,(char *)&(track[i]),(char *)&(track[endt]));
  151.     }
  152.     DSP_mos(0);
  153. }
  154. void    CD_stop(void)
  155. {
  156.     cdr_mstop(0);
  157.     if ( track != NULL )
  158.     free(track);
  159.     track = NULL;
  160.     acv = FALSE;
  161. }
  162. void    CD_vol_up(void)
  163. {
  164.     if ( ++vol > 127 )
  165.     vol = 127;
  166.     SND_elevol_set(1,vol,vol);
  167. }
  168. void    CD_vol_down(void)
  169. {
  170.     if ( --vol < 0 )
  171.     vol = 0;
  172.     SND_elevol_set(1,vol,vol);
  173. }
  174. void    CD_vol_set(int n)
  175. {
  176.     if ( (vol = n) < 0 ) vol = 0;
  177.     if ( vol > 127 ) vol = 127;
  178.     SND_elevol_set(1,vol,vol);
  179. }
  180. void    CD_event(EVENT *ep)
  181. {
  182.     static int tick=0;
  183.  
  184.     switch(ep->now) {
  185.     case EVT_CLIP_MOS:
  186.     EVT_clip_on(ep);
  187.     if ( ep->no == 1 || ep->no == 2 ) {
  188.         tick = 100;
  189.         ep->now = EVT_REP_MOS;
  190.     }
  191.     case EVT_ON_MOS:
  192.     DSP_mos(1);
  193.     break;
  194.  
  195.     case EVT_SELECT_MOS:
  196.     EVT_clip_off(ep);
  197.     DSP_mos(0);
  198.     cd_event = ep->no;
  199.     break;
  200.  
  201.     case EVT_REP_MOS:
  202.     if ( --tick < 0 ) {
  203.         cd_event = ep->no;
  204.         tick = 100;
  205.     }
  206.     break;
  207.  
  208.     case EVT_DOLACK_MOS:
  209.     ep->now = EVT_NON;
  210.     case EVT_MOVE_MOS:
  211.     EVT_clip_off(ep);
  212.     case EVT_OFF_MOS:
  213.     DSP_mos(0);
  214.     break;
  215.     }
  216. }
  217.  
  218. void    CD_menu(void)
  219. {
  220.     int    i;
  221.     BLOCK  *save;
  222.     static char *sw[]={ "RETN"," UP ","DOWN","STOP","BACK","PLAY","NEXT" };
  223.  
  224.     MOS_disp(FALSE);
  225.     MOS_push(DSP_X1,DSP_Y1,DSP_X2,DSP_Y2);
  226.     MOS_setpos((DSP_X1+DSP_X2)/2,(DSP_Y1+DSP_Y2)/2);
  227.     save = DSP_push_vram(DSP_X1,DSP_Y1,DSP_X2,DSP_Y2);
  228.     DSP_box(DSP_X1,DSP_Y1,DSP_X2,DSP_Y2,COL_LINE,DSP_COL);
  229.  
  230.     for ( i = 0 ; i < 7 ; i++ )
  231.     EVT_sw(DSP_X1+i*DSP_SIZ+2,DSP_Y1+2,
  232.         sw[i],COL_CHR,DSP_COL,600,CD_event,i);
  233.  
  234.     MOS_disp(TRUE);
  235.     for ( ; ; ) {
  236.     cd_event = ERR;
  237.     EVT_loop(600);
  238.     switch(cd_event) {
  239.     case 0: goto ENDOF;
  240.     case 1: CD_vol_up(); break;
  241.     case 2: CD_vol_down(); break;
  242.     case 3: CD_stop(); break;
  243.     case 4: CD_back(); break;
  244.     case 5: CD_play(); break;
  245.     case 6: CD_next(); break;
  246.     }
  247.     }
  248.  
  249. ENDOF:
  250.     EVT_level_free(600);
  251.     MOS_disp(FALSE);
  252.     MOS_push(ERR,ERR,ERR,ERR);
  253.     DSP_pop_vram(save);
  254. }
  255.